package com.hmall.pay.controller;

import com.hmall.api.dto.PayOrderDTO;
import com.hmall.common.exception.BizIllegalException;
import com.hmall.common.utils.BeanUtils;
import com.hmall.pay.domain.dto.PayApplyDTO;
import com.hmall.pay.domain.dto.PayOrderFormDTO;
import com.hmall.pay.domain.po.PayOrder;
import com.hmall.pay.domain.vo.PayOrderVO;
import com.hmall.pay.enums.PayType;
import com.hmall.pay.service.IPayOrderService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 支付相关接口控制器
 * 处理支付订单的创建、查询和支付等HTTP请求
 */
@Api(tags = "支付相关接口")
@RestController
@RequestMapping("pay-orders")
@RequiredArgsConstructor
public class PayController {

    private final IPayOrderService payOrderService; // 注入支付订单服务

    /**
     * 生成支付订单接口
     * @param applyDTO 支付申请DTO
     * @return 支付订单ID
     */
    @ApiOperation("生成支付单")
    @PostMapping
    public String applyPayOrder(@RequestBody PayApplyDTO applyDTO) {

        // 1. 校验支付类型（目前只支持余额支付）
        if (!PayType.BALANCE.equalsValue(applyDTO.getPayType())) {
            throw new BizIllegalException("抱歉，目前只支持余额支付");
        }
        // 2. 调用服务层生成支付订单
        return payOrderService.applyPayOrder(applyDTO);
    }

    /**
     * 尝试使用余额支付接口
     * @param id 支付订单ID
     * @param payOrderFormDTO 支付订单表单DTO
     */
    @ApiOperation("尝试基于用户余额支付")
    @ApiImplicitParam(value = "支付单id", name = "id", required = true)
    @PostMapping("{id}")
    public void tryPayOrderByBalance(@PathVariable("id") Long id, @RequestBody PayOrderFormDTO payOrderFormDTO) {

        // 1. 设置支付订单ID（从路径参数获取）
        payOrderFormDTO.setId(id);

        // 2. 调用服务层执行余额支付
        payOrderService.tryPayOrderByBalance(payOrderFormDTO);

    }

    /**
     * 查询所有支付订单接口
     * @return 支付订单VO列表
     */
    @ApiOperation("查询支付单")
    @GetMapping
    public List<PayOrderVO> queryPayOrders() {
        // 1. 查询所有支付订单实体
        // 2. 转换为VO对象并返回
        return BeanUtils.copyList(payOrderService.list(), PayOrderVO.class);
    }

    /**
     * 根据业务订单号查询支付订单接口
     * @param id 业务订单ID
     * @return 支付订单DTO
     */
    @ApiOperation("根据id查询支付单")
    @GetMapping("/biz/{id}")
    public PayOrderDTO queryPayOrderByBizOrderNo(@PathVariable("id") Long id) {

        // 1. 根据业务订单号查询支付订单实体
        PayOrder payOrder = payOrderService.lambdaQuery()
                .eq(PayOrder::getBizOrderNo, id)
                .one();

        // 2. 转换为DTO对象并返回
        return BeanUtils.copyBean(payOrder, PayOrderDTO.class);

    }
}